From 3c10a567387e525780de3dddfbdb720c60a9d51a Mon Sep 17 00:00:00 2001 From: "chris@ubuntu.eng.hq.xensource.com" Date: Thu, 15 Dec 2005 16:17:13 -0700 Subject: [PATCH] Add and use write_ldt_entry, as seen in later linux kernel versions. Signed-off-by: Christian Limpach --- linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c | 10 +++------- linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c | 10 ++++++++++ linux-2.6-xen-sparse/include/asm-xen/asm-i386/desc.h | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c b/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c index 5ef1ed10fc..50145a50fb 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c @@ -186,8 +186,7 @@ static int read_default_ldt(void __user * ptr, unsigned long bytecount) static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode) { struct mm_struct * mm = current->mm; - __u32 entry_1, entry_2, *lp; - maddr_t mach_lp; + __u32 entry_1, entry_2; int error; struct user_desc ldt_info; @@ -215,9 +214,6 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode) goto out_unlock; } - lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt); - mach_lp = arbitrary_virt_to_machine(lp); - /* Allow LDTs to be cleared by the user. */ if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { if (oldmode || LDT_empty(&ldt_info)) { @@ -234,8 +230,8 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode) /* Install the new entry ... */ install: - error = HYPERVISOR_update_descriptor( - mach_lp, (u64)entry_1 | ((u64)entry_2<<32)); + error = write_ldt_entry(mm->context.ldt, ldt_info.entry_number, + entry_1, entry_2); out_unlock: up(&mm->context.sem); diff --git a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c index 05d16638ab..7fde02f245 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c @@ -438,6 +438,16 @@ void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order) balloon_unlock(flags); } +#ifdef __i386__ +int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b) +{ + __u32 *lp = (__u32 *)((char *)ldt + entry * 8); + maddr_t mach_lp = arbitrary_virt_to_machine(lp); + return HYPERVISOR_update_descriptor( + mach_lp, (u64)entry_a | ((u64)entry_b<<32)); +} +#endif + /* * Local variables: * c-file-style: "linux" diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/desc.h b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/desc.h index 3c3b1d2d90..29c4211752 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/desc.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/desc.h @@ -87,6 +87,8 @@ static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size) (info)->seg_not_present == 1 && \ (info)->useable == 0 ) +extern int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b); + #if TLS_SIZE != 24 # error update this code. #endif -- 2.30.2